package com.finance.cooperate.dao.support.query;

import lombok.NoArgsConstructor;
import org.apache.commons.lang3.builder.EqualsBuilder;
import org.apache.commons.lang3.builder.HashCodeBuilder;

import java.io.Serializable;

/**
 * 类名称 : Filter
 * 功能描述 :筛选
 * 创建时间 : 2018/11/14 15:15
 * 创建人： 沈安心
 * 修改人 修改日期 修改描述：
 * -----------------------------------
 */
@NoArgsConstructor
public class Filter implements Serializable {

    private static final long serialVersionUID = -8712382358441065075L;

    //默认是否忽略大小写
    private static final boolean DEFAULT_IGNORE_CASE = false;
    //默认是否动态SQL
    private static final boolean DEFAULT_DYNAMIC_SQL = false;
    //属性
    private String property;
    //运算符
    private Operator operator;
    //值
    private Object[] values;
    //是否忽略大小写
    private Boolean ignoreCase = DEFAULT_IGNORE_CASE;
    //是否动态sql
    private Boolean dynamicSql = DEFAULT_DYNAMIC_SQL;


    /*
     * 创建人：沈安心
     * 功能描述：构造方法
     * 创建时间：2018/11/14 16:51
     * 入参：[property 属性, operator 运算符,dynamicSql 动态sql, values 值]
     * 返回值：
     */
    public Filter(String property, Operator operator, boolean dynamicSql, Object... values) {
        this.property = property;
        this.operator = operator;
        this.dynamicSql = dynamicSql;
        this.values = values;
    }

    /*
     * 创建人：沈安心
     * 功能描述：构造方法，如果忽略大小写则不支持可变参数
     * 创建时间：2018/11/14 16:52
     * 入参：[property 属性, operator 运算符, ignoreCase 忽略大小写, value 值]
     * 返回值：
     */
    public Filter(String property, Operator operator, boolean dynamicSql, boolean ignoreCase, Object value) {
        this.property = property;
        this.operator = operator;
        this.dynamicSql = dynamicSql;
        this.ignoreCase = ignoreCase;
        this.values = new Object[1];
        this.values[0] = value;
    }

    /*
     * 创建人：沈安心
     * 功能描述：返回等于筛选
     * 创建时间：2018/11/14 16:52
     * 入参：[property 属性, value 值]
     * 返回值：com.mq.common.support.jpa.specification.Filter 等于筛选
     */
    public static Filter eq(String property, Object value) {
        return new Filter(property, Operator.eq, DEFAULT_DYNAMIC_SQL, value);
    }

    /*
     * 创建人：沈安心
     * 功能描述：返回等于筛选
     * 创建时间：2018/11/14 16:53
     * 入参：[property 属性, ignoreCase 忽略大小写, value 值]
     * 返回值：com.mq.common.support.jpa.specification.Filter 等于筛选
     */
    public static Filter eq(String property, boolean dynamicSql, Object value) {
        return new Filter(property, Operator.eq, dynamicSql, value);
    }


    /*
     * 创建人：沈安心
     * 功能描述：返回等于筛选
     * 创建时间：2018/11/14 16:53
     * 入参：[property 属性, ignoreCase 忽略大小写, value 值]
     * 返回值：com.mq.common.support.jpa.specification.Filter 等于筛选
     */
    public static Filter eq(String property, boolean dynamicSql, boolean ignoreCase, Object value) {
        return new Filter(property, Operator.eq, dynamicSql, ignoreCase, value);
    }


    /*
     * 创建人：沈安心
     * 功能描述：返回不等于筛选
     * 创建时间：2018/11/14 16:54
     * 入参：[property 属性, values 值]
     * 返回值：com.mq.common.support.jpa.specification.Filter 不等于筛选
     */
    public static Filter ne(String property, Object value) {
        return new Filter(property, Operator.ne, DEFAULT_DYNAMIC_SQL, value);
    }

    /*
     * 创建人：沈安心
     * 功能描述：返回不等于筛选
     * 创建时间：2018/11/14 16:54
     * 入参：[property 属性, values 值]
     * 返回值：com.mq.common.support.jpa.specification.Filter 不等于筛选
     */
    public static Filter ne(String property, boolean dynamicSql, Object value) {
        return new Filter(property, Operator.ne, dynamicSql, value);
    }

    /*
     * 创建人：沈安心
     * 功能描述：返回不等于筛选
     * 创建时间：2018/11/14 16:54
     * 入参：[property 属性, ignoreCase 忽略大小写, value 值]
     * 返回值：com.mq.common.support.jpa.specification.Filter 不等于筛选
     */
    public static Filter ne(String property, boolean dynamicSql, boolean ignoreCase, Object value) {
        return new Filter(property, Operator.ne, dynamicSql, ignoreCase, value);
    }

    /*
     * 创建人：沈安心
     * 功能描述：返回大于筛选
     * 创建时间：2018/11/14 16:55
     * 入参：[property 属性, value 值]
     * 返回值：com.mq.common.support.jpa.specification.Filter 大于筛选
     */
    public static Filter gt(String property, Object value) {
        return new Filter(property, Operator.gt, DEFAULT_DYNAMIC_SQL, value);
    }

    /*
     * 创建人：沈安心
     * 功能描述：返回大于筛选
     * 创建时间：2018/11/14 16:55
     * 入参：[property 属性, value 值]
     * 返回值：com.mq.common.support.jpa.specification.Filter 大于筛选
     */
    public static Filter gt(String property, boolean dynamicSql, Object value) {
        return new Filter(property, Operator.gt, dynamicSql, value);
    }

    /*
     * 创建人：沈安心
     * 功能描述：返回小于筛选
     * 创建时间：2018/11/14 16:57
     * 入参：[property 属性, value 值]
     * 返回值：com.mq.common.support.jpa.specification.Filter 小于筛选
     */
    public static Filter lt(String property, Object value) {
        return new Filter(property, Operator.lt, DEFAULT_DYNAMIC_SQL, value);
    }

    /*
     * 创建人：沈安心
     * 功能描述：返回小于筛选
     * 创建时间：2018/11/14 16:57
     * 入参：[property 属性, value 值]
     * 返回值：com.mq.common.support.jpa.specification.Filter 小于筛选
     */
    public static Filter lt(String property, boolean dynamicSql, Object value) {
        return new Filter(property, Operator.lt, dynamicSql, value);
    }

    /*
     * 创建人：沈安心
     * 功能描述：返回大于等于筛选
     * 创建时间：2018/11/14 16:58
     * 入参：[property 属性, value 值]
     * 返回值：com.mq.common.support.jpa.specification.Filter 大于等于筛选
     */
    public static Filter ge(String property, Object value) {
        return new Filter(property, Operator.ge, DEFAULT_DYNAMIC_SQL, value);
    }

    /*
     * 创建人：沈安心
     * 功能描述：返回大于等于筛选
     * 创建时间：2018/11/14 16:58
     * 入参：[property 属性, value 值]
     * 返回值：com.mq.common.support.jpa.specification.Filter 大于等于筛选
     */
    public static Filter ge(String property, boolean dynamicSql, Object value) {
        return new Filter(property, Operator.ge, dynamicSql, value);
    }

    /*
     * 创建人：沈安心
     * 功能描述：返回小于等于筛选
     * 创建时间：2018/11/14 16:58
     * 入参：[property 属性, value 值]
     * 返回值：com.mq.common.support.jpa.specification.Filter 小于等于筛选
     */
    public static Filter le(String property, Object value) {
        return new Filter(property, Operator.le, DEFAULT_DYNAMIC_SQL, value);
    }

    /*
     * 创建人：沈安心
     * 功能描述：返回小于等于筛选
     * 创建时间：2018/11/14 16:58
     * 入参：[property 属性, value 值]
     * 返回值：com.mq.common.support.jpa.specification.Filter 小于等于筛选
     */
    public static Filter le(String property, boolean dynamicSql, Object value) {
        return new Filter(property, Operator.le, dynamicSql, value);
    }

    /*
     * 创建人：沈安心
     * 功能描述：返回相似筛选
     * 创建时间：2018/11/14 16:59
     * 入参：[property 属性, value 值]
     * 返回值：com.mq.common.support.jpa.specification.Filter 相似筛选
     */
    public static Filter like(String property, Object value) {
        return new Filter(property, Operator.like, DEFAULT_DYNAMIC_SQL, value);
    }

    /*
     * 创建人：沈安心
     * 功能描述：返回相似筛选
     * 创建时间：2018/11/14 16:59
     * 入参：[property 属性, value 值]
     * 返回值：com.mq.common.support.jpa.specification.Filter 相似筛选
     */
    public static Filter like(String property, boolean dynamicSql, Object value) {
        return new Filter(property, Operator.like, dynamicSql, value);
    }


    /*
     * 创建人：沈安心
     * 功能描述：返回相似筛选
     * 创建时间：2018/11/14 16:59
     * 入参：[property 属性, value 值]
     * 返回值：com.mq.common.support.jpa.specification.Filter 相似筛选
     */
    public static Filter likeL(String property, Object value) {
        return new Filter(property, Operator.likeL, DEFAULT_DYNAMIC_SQL, value);
    }

    /*
     * 创建人：沈安心
     * 功能描述：返回相似筛选
     * 创建时间：2018/11/14 16:59
     * 入参：[property 属性, value 值]
     * 返回值：com.mq.common.support.jpa.specification.Filter 相似筛选
     */
    public static Filter likeL(String property, boolean dynamicSql, Object value) {
        return new Filter(property, Operator.likeL, dynamicSql, value);
    }



    /*
     * 创建人：沈安心
     * 功能描述：返回相似筛选
     * 创建时间：2018/11/14 16:59
     * 入参：[property 属性, value 值]
     * 返回值：com.mq.common.support.jpa.specification.Filter 相似筛选
     */
    public static Filter likeR(String property, Object value) {
        return new Filter(property, Operator.likeR, DEFAULT_DYNAMIC_SQL, value);
    }

    /*
     * 创建人：沈安心
     * 功能描述：返回相似筛选
     * 创建时间：2018/11/14 16:59
     * 入参：[property 属性, value 值]
     * 返回值：com.mq.common.support.jpa.specification.Filter 相似筛选
     */
    public static Filter likeR(String property, boolean dynamicSql, Object value) {
        return new Filter(property, Operator.likeR, dynamicSql, value);
    }


    /*
     * 创建人：沈安心
     * 功能描述：返回范围值（如果是时间范围，则开始时间设置为开始时间凌晨，结束时间设置为结束时间最后时刻）
     * 创建时间：2018/12/25 16:53
     * 入参：[property, value]
     * 返回值：com.mq.dao.support.jpa.query.Filter
     */
    public static Filter between(String property, Object value1, Object value2) {
        return new Filter(property, Operator.between, DEFAULT_DYNAMIC_SQL, value1, value2);
    }

    /*
     * 创建人：沈安心
     * 功能描述：返回范围值（如果是时间范围，则开始时间设置为开始时间凌晨，结束时间设置为结束时间最后时刻）
     * 创建时间：2018/12/25 16:53
     * 入参：[property, value]
     * 返回值：com.mq.dao.support.jpa.query.Filter
     */
    public static Filter between(String property, boolean dynamicSql, Object value1, Object value2) {
        return new Filter(property, Operator.between, dynamicSql, value1, value2);
    }

    /*
     * 创建人：沈安心
     * 功能描述：返回包含筛选
     * 创建时间：2018/11/14 16:59
     * 入参：[property 属性, value 值]
     * 返回值：com.mq.common.support.jpa.specification.Filter 包含筛选
     */
    public static Filter in(String property, Object value) {
        return new Filter(property, Operator.in, DEFAULT_DYNAMIC_SQL, value);
    }

    /*
     * 创建人：沈安心
     * 功能描述：返回包含筛选
     * 创建时间：2018/11/14 16:59
     * 入参：[property 属性, value 值]
     * 返回值：com.mq.common.support.jpa.specification.Filter 包含筛选
     */
    public static Filter in(String property, boolean dynamicSql, Object value) {
        return new Filter(property, Operator.in, dynamicSql, value);
    }

    /*
     * 创建人：沈安心
     * 功能描述：返回为Null筛选
     * 创建时间：2018/11/14 17:00
     * 入参：[property 属性]
     * 返回值：为Null筛选
     */
    public static Filter isNull(String property) {
        return new Filter(property, Operator.isNull, DEFAULT_DYNAMIC_SQL, null);
    }

    /*
     * 创建人：沈安心
     * 功能描述：返回不为Null筛选
     * 创建时间：2018/11/14 17:00
     * 入参：[property 属性]
     * 返回值：com.mq.common.support.jpa.specification.Filter 不为Null筛选
     */
    public static Filter isNotNull(String property) {
        return new Filter(property, Operator.isNotNull, DEFAULT_DYNAMIC_SQL, null);
    }

    /*
     * 创建人：沈安心
     * 功能描述：返回忽略大小写筛选
     * 创建时间：2018/11/14 17:01
     * 入参：[]
     * 返回值：com.mq.common.support.jpa.specification.Filter 忽略大小写筛选
     */
    public Filter ignoreCase() {
        this.ignoreCase = true;
        return this;
    }

    /*
     * 创建人：沈安心
     * 功能描述：获取属性
     * 创建时间：2018/11/14 17:01
     * 入参：[]
     * 返回值：java.lang.String 属性
     */
    public String getProperty() {
        return property;
    }

    /*
     * 创建人：沈安心
     * 功能描述：设置属性
     * 创建时间：2018/11/14 17:02
     * 入参：[property 属性]
     * 返回值：void
     */
    public void setProperty(String property) {
        this.property = property;
    }

    /*
     * 创建人：沈安心
     * 功能描述：获取运算符
     * 创建时间：2018/11/14 17:02
     * 入参：[]
     * 返回值：com.mq.common.support.jpa.specification.Operator 运算符
     */
    public Operator getOperator() {
        return operator;
    }

    /*
     * 创建人：沈安心
     * 功能描述：设置运算符
     * 创建时间：2018/11/14 17:02
     * 入参：[operator 运算符]
     * 返回值：void
     */
    public void setOperator(Operator operator) {
        this.operator = operator;
    }

    /*
     * 创建人：沈安心
     * 功能描述：获取值
     * 创建时间：2018/11/14 17:03
     * 入参：[]
     * 返回值：java.lang.Object 值
     */
    public Object[] getValues() {
        return values;
    }

    /*
     * 创建人：沈安心
     * 功能描述：设置值
     * 创建时间：2018/11/14 17:03
     * 入参：[value 值]
     * 返回值：void
     */
    public void setValues(Object[] values) {
        this.values = values;
    }

    /*
     * 创建人：沈安心
     * 功能描述：获取是否忽略大小写
     * 创建时间：2018/11/14 17:03
     * 入参：[]
     * 返回值：java.lang.Boolean 是否忽略大小写
     */
    public Boolean getIgnoreCase() {
        return ignoreCase;
    }

    /*
     * 创建人：沈安心
     * 功能描述：设置是否忽略大小写
     * 创建时间：2018/11/14 17:04
     * 入参：[ignoreCase 是否忽略大小写]
     * 返回值：void
     */
    public void setIgnoreCase(Boolean ignoreCase) {
        this.ignoreCase = ignoreCase;
    }

    public Boolean getDynamicSql() {
        return dynamicSql;
    }

    public void setDynamicSql(Boolean dynamicSql) {
        this.dynamicSql = dynamicSql;
    }

    /*
     * 创建人：沈安心
     * 功能描述：重写equals方法
     * 创建时间：2018/11/14 17:04
     * 入参：[obj 对象]
     * 返回值：boolean 是否相等
     */
    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        if (this == obj) {
            return true;
        }
        Filter other = (Filter) obj;
        return new EqualsBuilder().append(getProperty(), other.getProperty()).append(getOperator(), other.getOperator()).append(getValues(), other.getValues()).isEquals();
    }

    /*
     * 创建人：沈安心
     * 功能描述：重写hashCode方法
     * 创建时间：2018/11/14 17:05
     * 入参：[]
     * 返回值：int
     */
    @Override
    public int hashCode() {
        return new HashCodeBuilder(17, 37).append(getProperty()).append(getOperator()).append(getValues()).toHashCode();
    }


    /*
     * 创建人：沈安心
     * 功能描述：判断一个对象及对象里的字符串属性是否为空
     * 创建时间：2018/12/27 15:31
     * 入参：[obj]
     * 返回值：boolean
     */
    private static boolean isEmptyOrNvl(Object obj) {
        if (obj == null || "null".equals(obj)) {
            return true;
        } else {
            if (obj.getClass().isAssignableFrom(String.class)) {
                if (String.valueOf(obj).trim().equals("")) {
                    return true;
                }
            }
            return false;
        }
    }
}